#pragma once
#include <QGraphicsItem>
#include <QPointF>
#include <QRectF>
#include <QPainter>
#include <QColor>
#include <QString>
#include <QList>
#include <QVariant>

// 前向声明
class BaseNode;

// 端口类型枚举
enum class PortType {
    Input,   // 输入端口
    Output   // 输出端口
};

class BasePort : public QGraphicsItem
{
public:
    explicit BasePort(BaseNode* parentNode, PortType type);
    virtual ~BasePort() = default;

    // QGraphicsItem 必须实现的方法
    QRectF boundingRect() const override;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;

    // 端口基本属性
    PortType getType() const { return m_type; }
    BaseNode* getParentNode() const { return m_parentNode; }
    
    // 端口数据操作
    virtual void setData(const QVariant& data);
    virtual QVariant getData() const;
    virtual bool hasData() const;
    
    // 端口连接管理
    void addConnection(QGraphicsItem* connection);
    void removeConnection(QGraphicsItem* connection);
    const QList<QGraphicsItem*>& getConnections() const { return m_connections; }
    
    // 端口类型相关
    virtual QString getDataType() const = 0;  // 纯虚函数：获取端口数据类型
    virtual QColor getPortColor() const = 0;  // 纯虚函数：获取端口颜色

protected:
    // 端口基本属性
    PortType m_type;              // 端口类型
    BaseNode* m_parentNode;       // 父节点
    qreal m_radius;               // 端口半径
    QVariant m_data;              // 端口数据
    bool m_hasData;               // 是否有数据
    
    // 连接管理
    QList<QGraphicsItem*> m_connections;  // 连接到此端口的连接线
};